var config = require('../config/config.js');
var util = require('./util.js');

// 用户信息存储在App对象中。
// app.user -> userInfo
// app.
// 初次进入APP, APP Lauch时检查用户登录状态，并获取用户信息。

/**
 * 检测登录状态
 * @param callBack Function
 */
function checkSession() {
    return new Promise((resolve, reject) => {
        wx.checkSession({
            success: function (res) {
                let seesionId = util.getSessionId();
                if (!seesionId) {
                    return userLogin(res);
                } else {
                    resolve(seesionId);
                }
            },
            fail: function (res) {
                return userLogin(res);
            },
        })
    })

}

/**
 * 将登录信息保存到全局。
 */
function saveLoginInfo(info) {
    let app = getApp();
    app.globalData.loginInfo = {
        code: info.code
    };
}

/**
 * 微信登录
 */
function wxLogin() {
    return new Promise((resolve, reject) => {
        wx.login({
            success: function (res) {
                saveLoginInfo(res);
                resolve(res);
            },
            fail: function (res) {
                reject(res);
            }
        });
    })

}

/**
 * 用户登录。
 * 首先微信登录，获取code，使用code从后端
 * 取回sessionID并存储。
 */
function userLogin() {
    return wxLogin()
        .then(getUserInfo)
        .then(requestLogin);
}

function requestLogin(user) {
    return new Promise((resolve, reject) => {
        user = !user.rawData ? user : user.userInfo;
        let app = getApp();
        let code = app.globalData.loginInfo.code;
        let reqUserObj = {
            url: config.domain.requestDomain + config.service.userLogin,
            header: {'content-type': 'application/x-www-form-urlencoded'},
            method: "POST",
            data: {
                jsCode: code,
                nickName: user.nickName,
                avatarUrl: user.avatarUrl,
                gender: user.gender,
                country: user.country,
                province: user.province,
                city: user.city,
                systemInfo: JSON.stringify(util.getSystemInfo())
            },
            success: function (res) {
                // 登录成功,得到SessionId,存储sessionID
                if (res.data.code === 0) {
                    let sessionId = res.data.data.cSessionId;
                    wx.setStorageSync(config.storage.keySessionId, sessionId);
                    console.log("User-sessionId", sessionId);
                    resolve(res);
                } else {
                    reject(res)
                }
            },
            fail: function (res) {
                reject(res);
            },
            complete: function (res) {
                console.log("User-userLogin", res);
            },
        };
        wx.request(reqUserObj);
    })
}

/**
 * 获取用户信息。
 * 弹出授权页面,该接口不会出现加密信息。
 * @param successCb Function
 */
function getUserInfo() {
    let app = getApp();
    return new Promise((resolve, reject) => {
        wx.getUserInfo({
            withCredentials: false,
            success: function (res) {
                // Storage the user info
                wx.setStorage({
                    key: config.storage.keyUserInfo,
                    data: res,
                });
                app.globalData.user = res;
                resolve(res);
            },
            fail: function (res) {
                reject(res);
            },
            complete: function (res) {
                console.log("User-getUserInfo", res);
            }
        })
    })
}


/**
 * 获取用户信息；
 * 会弹出授权窗口，用户点击授权后，会授权获取用户信息。
 * 将获取到的用户信息存储到本地磁盘。
 */
function getUserInfoEncricyData() {
    checkSession();
    var app = getApp();
    let userInfo = app.globalData.userInfo;
    if (userInfo) {
        return userInfo;
    }
    wx.getUserInfo({
        withCredentials: true,
        success: function (res) {
            userInfo = res.userInfo;
            let req = {
                signature: res.signature,
                encryptedData: res.encryptedData,
                iv: res.iv,
                // code: app.globalData.loginInfo.code
            }
        },
        fail: function (res) {
        },
    });
}

module.exports = {
    checkSession: checkSession,
    userLogin: userLogin,
    getUserInfo: getUserInfo
};